using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace HerenityCode.Reference
{
    namespace SingletonPattern
    {
        /// <summary>
        /// Description：继承MonoBehaviour的自动单例模式基类，继承了这个类的类就继承了MonoBehaviour，并且自带单例模式。
        /// Author:哒先生
        /// Date:2024年10月9日15:17:36
        /// </summary>
        public class SingletonPatternMonoAutoBase<T> : MonoBehaviour where T : MonoBehaviour
        {
            //构造方法私有化，防止外部new对象。
            protected SingletonPatternMonoAutoBase()
            {
            }

            //记录单例对象是否存在。用于防止在OnDestroy方法中访问单例对象报错。
            public static bool IsExisted { get; private set; } = false;

            //提供一个属性给外部访问，这个属性就相当于是单例对象。
            private static T _instance;

            public static T Instance
            {
                get
                {
                    if (_instance == null)
                    {
                        _instance = FindObjectOfType<T>();
                        if (_instance == null)
                        {
                            GameObject go = new GameObject(typeof(T).Name); //创建游戏对象
                            _instance = go.AddComponent<T>(); //挂载脚本
                            IsExisted = true;
                        }
                    }

                    return _instance;
                }
            }

            protected virtual void OnDestroy()
            {
                IsExisted = false;
            }
        }
    }
}